{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RMSprop from scratch\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-10-22T11:54:29.256614Z",
     "start_time": "2017-10-22T11:54:28.429106Z"
    }
   },
   "outputs": [],
   "source": [
    "from mxnet import ndarray as nd\n",
    "\n",
    "# RMSProp.\n",
    "def rmsprop(params, sqrs, lr, gamma, batch_size):\n",
    "    eps_stable = 1e-8\n",
    "    for param, sqr in zip(params, sqrs):\n",
    "        g = param.grad / batch_size\n",
    "        sqr[:] = gamma * sqr + (1. - gamma) * nd.square(g)\n",
    "        div = lr * g / nd.sqrt(sqr + eps_stable)\n",
    "        param[:] -= div\n",
    "\n",
    "import mxnet as mx\n",
    "from mxnet import autograd\n",
    "from mxnet import gluon\n",
    "import random\n",
    "\n",
    "mx.random.seed(1)\n",
    "random.seed(1)\n",
    "\n",
    "# Generate data.\n",
    "num_inputs = 2\n",
    "num_examples = 1000\n",
    "true_w = [2, -3.4]\n",
    "true_b = 4.2\n",
    "X = nd.random_normal(scale=1, shape=(num_examples, num_inputs))\n",
    "y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_b\n",
    "y += .01 * nd.random_normal(scale=1, shape=y.shape)\n",
    "dataset = gluon.data.ArrayDataset(X, y)\n",
    "\n",
    "\n",
    "# Construct data iterator.\n",
    "def data_iter(batch_size):\n",
    "    idx = list(range(num_examples))\n",
    "    random.shuffle(idx)\n",
    "    for batch_i, i in enumerate(range(0, num_examples, batch_size)):\n",
    "        j = nd.array(idx[i: min(i + batch_size, num_examples)])\n",
    "        yield batch_i, X.take(j), y.take(j)\n",
    "\n",
    "# Initialize model parameters.\n",
    "def init_params():\n",
    "    w = nd.random_normal(scale=1, shape=(num_inputs, 1))\n",
    "    b = nd.zeros(shape=(1,))\n",
    "    params = [w, b]\n",
    "    sqrs = []\n",
    "    for param in params:\n",
    "        param.attach_grad()\n",
    "        sqrs.append(param.zeros_like())\n",
    "    return params, sqrs\n",
    "\n",
    "# Linear regression.\n",
    "def net(X, w, b):\n",
    "    return nd.dot(X, w) + b\n",
    "\n",
    "# Loss function.\n",
    "def square_loss(yhat, y):\n",
    "    return (yhat - y.reshape(yhat.shape)) ** 2 / 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-10-22T11:54:29.454549Z",
     "start_time": "2017-10-22T11:54:29.258245Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['figure.dpi']= 120\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def train(batch_size, lr, gamma, epochs, period):\n",
    "    assert period >= batch_size and period % batch_size == 0\n",
    "    [w, b], sqrs = init_params()\n",
    "    total_loss = [np.mean(square_loss(net(X, w, b), y).asnumpy())]\n",
    "\n",
    "    # Epoch starts from 1.\n",
    "    for epoch in range(1, epochs + 1):\n",
    "        for batch_i, data, label in data_iter(batch_size):\n",
    "            with autograd.record():\n",
    "                output = net(data, w, b)\n",
    "                loss = square_loss(output, label)\n",
    "            loss.backward()\n",
    "            rmsprop([w, b], sqrs, lr, gamma, batch_size)\n",
    "            if batch_i * batch_size % period == 0:\n",
    "                total_loss.append(np.mean(square_loss(net(X, w, b), y).asnumpy()))\n",
    "        print(\"Batch size %d, Learning rate %f, Epoch %d, loss %.4e\" % \n",
    "              (batch_size, lr, epoch, total_loss[-1]))\n",
    "    print('w:', np.reshape(w.asnumpy(), (1, -1)), \n",
    "          'b:', b.asnumpy()[0], '\\n')\n",
    "    x_axis = np.linspace(0, epochs, len(total_loss), endpoint=True)\n",
    "    plt.semilogy(x_axis, total_loss)\n",
    "    plt.xlabel('epoch')\n",
    "    plt.ylabel('loss')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2017-10-22T11:54:31.157665Z",
     "start_time": "2017-10-22T11:54:29.456316Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch size 10, Learning rate 0.030000, Epoch 1, loss 7.5963e-01\n",
      "Batch size 10, Learning rate 0.030000, Epoch 2, loss 1.4048e-04\n",
      "Batch size 10, Learning rate 0.030000, Epoch 3, loss 1.1444e-04\n",
      "w: [[ 2.003901  -3.3957026]] b: 4.20971 \n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10aefec18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train(batch_size=10, lr=0.03, gamma=0.9, epochs=3, period=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Next\n",
    "[RMSProp with Gluon](../chapter06_optimization/rmsprop-gluon.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For whinges or inquiries, [open an issue on  GitHub.](https://github.com/zackchase/mxnet-the-straight-dope)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
